package pzl.com.library.model;

import android.util.Log;

import java.util.HashMap;

/**
 * @author zl.peng
 * @version [1.0, 2016-11-21]
 */
public class XBounds {
    private static final String TAG = "XBounds";

    /**
     * 最小的可视数据索引位置
     */
    private int minVisibleIndex;

    /**
     * 最大的可视数据索引位置
     */

    /**
     * 可视数据索引范围个数
     */
    private int visibleIndexRange;

    /**
     * 数据长度大小(最长数据集的size,比对，动态add,remove,当前可视域 ：有数据则绘制，无数据则不绘制)
     */
    private int dataSizeLongest = -1;

    /**
     * 所有数据的size
     */
    private HashMap<String, Integer> dataSizeMap = new HashMap<>();


    public int getMinVisibleIndex() {
        checkDataSize();
        return minVisibleIndex;
    }

    public void setMinVisibleIndex(int minVisibleIndex) {
        checkDataSize();
        if (dataSizeLongest == 0) this.minVisibleIndex = 0;
        if (minVisibleIndex < 0 || minVisibleIndex > dataSizeLongest - 1) {
            Log.e(TAG, "ERROR set minVisibleIndex =" + minVisibleIndex + ",dataSizeLongest=" + dataSizeLongest);
            return;
        }
        this.minVisibleIndex = minVisibleIndex;
    }

    public int getMaxVisibleIndex() {
        checkDataSize();
        if (dataSizeLongest == 0) return 0;
        int maxVisibleIndex = minVisibleIndex + visibleIndexRange;
        if (maxVisibleIndex > dataSizeLongest - 1) maxVisibleIndex = dataSizeLongest - 1;
        return maxVisibleIndex;
    }

    public int getVisibleIndexRange() {
        return visibleIndexRange;
    }

    public void setVisibleIndexRange(int visibleIndexRange) {
        checkDataSize();
        if (minVisibleIndex + visibleIndexRange > dataSizeLongest - 1) {
            Log.e(TAG, "ERROR set visibleIndexRange =" + visibleIndexRange + ",minVisibleIndex=" + minVisibleIndex + ",dataSizeLongest=" + dataSizeLongest);
            return;
        }
        this.visibleIndexRange = visibleIndexRange;
    }

    public int getDataSizeLongest() {
        return dataSizeLongest;
    }

    /**
     * 按不同的key数据,设置更新它的size( 初始化size,动态add getDataListSize,动态remove getDataListSize,清空 getDataListSize,移除 getDataListSize 判断size=-1  hashMap 移除Entry)
     *
     * @param key
     * @param newSize
     */
    public void updateDataSize(String key, int newSize) {
        if (newSize == -1) dataSizeMap.remove(key);//移除了一条数据集合
        dataSizeMap.put(key, newSize);
        int longestSize = 0;
        for (String tempKey : dataSizeMap.keySet()) {
            int value = dataSizeMap.get(tempKey);
            if (value > longestSize) longestSize = value;
        }
        dataSizeLongest = longestSize;
    }


    /**
     * 初始化最小可视index
     *
     * @param minVisibleIndex
     */
    public void initMinVisibleIndex(int minVisibleIndex) {
        this.minVisibleIndex = minVisibleIndex;
    }

    /**
     * 初始化可视范围
     *
     * @param visibleIndexRange
     */
    public void initVisibleIndexRange(int visibleIndexRange) {
        this.visibleIndexRange = visibleIndexRange;
    }

    private void checkDataSize() {
        if (dataSizeLongest == -1) throw new IllegalStateException("没设置数据源的size");
    }

    /**
     * 根据数据源是否为null，反映是否可绘制
     *
     * @return
     */
    public boolean isDrawEnable() {
        return dataSizeLongest != -1;
    }


}
